草庐IT

C++ 11:std::thread池化?

全部标签

C++11 "late binding"模板参数

请不要误解我的“后期绑定(bind)”,我不是指通常的运行时后期绑定(bind),我指的是别的意思,找不到更好的词来形容它:考虑到我正在为一些需要将这些值与比较器进行比较的值类型V处理容器(或类似的)数据结构Containor,所以我的第一个模板看起来像这样template>structContainor{};现在,我的Containor结构在内部使用了另一个容器。要使用哪个容器也应该可以通过模板参数进行配置,假设默认值为std::set。所以我的下一个版本的Containor看起来像这样:template,typenameCont=std::set>structContainor{}

C++11 线程,在主线程上运行

我正在尝试C++11线程进行一些开发。我想在异步线程中运行一些代码,当该代码完成后,我想在主线程上运行其他代码但只有当它完成时!这是因为我想要异步运行的事情是加载OpenGL的东西,并且在执行线程时它对OpenGL上下文有点棘手,据我所知这几乎是一个不在不同的环境中运行相同的上下文线程。但是我想创建一个加载器线程,它加载collada文件,这里耗时的东西实际上是解析文件和设置数据以及我可以(技术上)在一个单独的线程中做的所有事情,然后只需在主线程上执行特定于opengl的任务。(这是我最初的想法,我可能只是走错了路)。所以我在想,如果我可以分离一个异步线程来加载collada文件并填充

C++11 - 编译时多态性解决方案

假设我正在编写一个跨平台库,我必须以不同平台有不同行为的方式组织代码,并且这种行为(或定义)是在编译时根据平台选择的我的图书馆正在编译。在C++中执行此操作的“通常”方法是在编写方法或类时用大量#ifdef污染代码。方法的问题在于:源代码看起来真的很丑如果您支持3个平台,您的源代码大约比您真正需要的大3倍,这意味着您的编译器仍然需要解析和分析所有代码才能“看到”#ifdef不同的实现之间没有真正的区别,当代码库增长时很难维护,而当你只有3-4个平台时,它增长得非常快。由于C++11中有很多新特性,我想知道是否有什么改变,是否有新的选项。 最佳答案

c++ - 将抽象仿函数分配给 std::function - 为什么 std::ref 是一个解决方案?

我想将仿函数对std::function的赋值封装到一个方法中。我必须传递从通用抽象类Slot继承的仿函数,而不是传递std::function或指向std::function的指针(即这些槽提供额外的功能)。我以不同的形式偶然发现了这个问题here.例如。在那里,使用通用槽指针而不是std:functions的动机是仿函数的生命周期管理。下面的代码说明了这个问题。请参阅assignFunctorPtr(...)方法。#include#includetemplateclassSlot;templateclassSlot{public:typedefRRet_type;public:vi

c++ - 抢占式多任务处理是否会干扰 C++11 发布-获取语义?

线程是否有可能(理论上)在一个CPU上执行acquire,然后立即被抢占并在另一个从未执行过acquire的CPU上恢复执行(因此从不根据发布-获取语义同步)?例如。考虑以下代码,它使用C++11原子和release-acquire内存排序来执行无锁线程安全初始化:if(false==_initFlag.load(memory_order_acquire)){_foo=...;//initializeglobal_bar=...;//initializeglobal...=...;//initializemoreglobals_initFlag.store(true,memory_or

c++ - std::next_permutation Implementation Explanation 似乎有点低效?

我很好奇std:next_permutation是如何实现的,所以我提取了gnulibstdc++4.7版本并清理了标识符和格式以生成以下演示...#include#include#includeusingnamespacestd;templateboolnext_permutation(Itbegin,Itend){if(begin==end)returnfalse;Iti=begin;++i;if(i==end)returnfalse;i=end;--i;while(true){Itj=i;--i;if(*iintmain(){vectorv={1,2,3,4};do{for(in

c++ - 在 C++ 中调用 std::sort 时使用 std::greater 的语法

反向排序容器的推荐方法(例如:Sortingavectorindescendingorder)似乎是:std::sort(numbers.begin(),numbers.end(),std::greater());我知道第三个参数是帮助sort()进行比较的函数或仿函数,而std::greater是模板仿函数,但我不明白这里发生了什么。我的C++很生疏,所以如果这些是愚蠢的问题,请耐心等待:为什么std::greater之后有括号?那里?我们要创建一个新的std::greater吗?对象在这里?在那种情况下,我们为什么不需要new关键词在这里? 最佳答案

非 C++11 程序中的 C++11 代码/库

假设我将C++11中的代码(我将使用Lambdas)编译为“.o”或库“.a”。我有一个程序,其中我将包含以前的库和头文件,我不能用C++11编译,但是旧的(C++98)。它会编译并正常工作吗? 最佳答案 如果满足以下条件,它将正常工作:(公共(public))头文件不使用任何C++11特性ABI没有改变就此咨询您的平台/编译器没有共同的依赖关系发生变化根据VaughnCato链接的GCC文档,这包括标准库。任何在使用C++11编译时生成不同代码或对象布局并被库和客户端使用的东西都可能是一个问题……即使它没有在接口(interfac

c++ - 是否可以为 std::array 定义隐式转换运算符?

我正在尝试拥有一个可以隐式转换为std::array的C++类。转换有效,但不是隐式的。#includeclassA{private:std::arraydata;public:operatorstd::array&(){returndata;}operatorconststd::array&()const{returndata;}};intmain(){Aa;a[1]=0.5f;//failstocompileautoit=a.begin();//failstocompileAb;static_cast>(b)[1]=0.5f;//okautoit2=static_cast>(b).

C++11 在 Visual Studio 2012 中的委托(delegate)构造函数

我正在尝试在VisualStudio2012中使用委托(delegate)构造函数。以下代码在Xcode4.6中编译但在VisualStudio2012中不编译:在.h文件中classErrorReportDlg:publicQDialog{public:ErrorReportDlg(OwlExceptionPtrex,QWidget*parent);ErrorReportDlg(QWidget*parent);virtual~ErrorReportDlg();}在.cpp文件中//FWIW,OwlExceptionPtris//typdefboost::shared_ptrOwlEx